/*
 * 无源蜂鸣器测试程序
 * 适用于Arduino平台
 * 智能学习桌项目
 */

// 蜂鸣器引脚定义
#define BUZZER_PIN 9  // 连接到Arduino的9号引脚（支持PWM）

// 音符频率定义
#define NOTE_C4  262  // 中音C (Do)
#define NOTE_D4  294  // 中音D (Re)
#define NOTE_E4  330  // 中音E (Mi)
#define NOTE_F4  349  // 中音F (Fa)
#define NOTE_G4  392  // 中音G (Sol)
#define NOTE_A4  440  // 中音A (La)
#define NOTE_B4  494  // 中音B (Si)
#define NOTE_C5  523  // 高音C (Do)

void setup() {
  // 初始化串口
  Serial.begin(9600);
  Serial.println("无源蜂鸣器测试开始...");
  
  // 设置蜂鸣器引脚为输出模式
  pinMode(BUZZER_PIN, OUTPUT);
  
  // 播放启动提示音
  playStartupTone();
  
  Serial.println("测试菜单:");
  Serial.println("1 - 播放音阶");
  Serial.println("2 - 播放警报声");
  Serial.println("3 - 播放小星星");
  Serial.println("4 - 播放生日快乐");
  Serial.println("5 - 播放SOS紧急信号");
}

void loop() {
  // 检查是否有串口输入
  if (Serial.available() > 0) {
    char command = Serial.read();
    
    switch (command) {
      case '1':
        Serial.println("播放音阶...");
        playScale();
        break;
      case '2':
        Serial.println("播放警报声...");
        playAlarm();
        break;
      case '3':
        Serial.println("播放小星星...");
        playTwinkleStar();
        break;
      case '4':
        Serial.println("播放生日快乐...");
        playHappyBirthday();
        break;
      case '5':
        Serial.println("播放SOS紧急信号...");
        playSOS();
        break;
      default:
        // 无效命令，播放错误提示音
        playErrorTone();
        break;
    }
  }
  
  // 每隔5秒播放一次提示音
  static unsigned long lastBeepTime = 0;
  if (millis() - lastBeepTime > 5000) {
    playBeep(1000, 50);
    lastBeepTime = millis();
  }
}//
 播放启动提示音
void playStartupTone() {
  playTone(NOTE_C4, 100);
  delay(50);
  playTone(NOTE_E4, 100);
  delay(50);
  playTone(NOTE_G4, 100);
  delay(50);
  playTone(NOTE_C5, 300);
  delay(300);
}

// 播放错误提示音
void playErrorTone() {
  playTone(NOTE_C4, 100);
  delay(50);
  playTone(NOTE_C4, 100);
  delay(50);
}

// 播放音阶
void playScale() {
  int notes[] = {NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5};
  
  for (int i = 0; i < 8; i++) {
    playTone(notes[i], 200);
    delay(100);
  }
  
  delay(500);
  
  for (int i = 7; i >= 0; i--) {
    playTone(notes[i], 200);
    delay(100);
  }
}

// 播放警报声
void playAlarm() {
  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
      playTone(880, 100);
      delay(100);
    }
    delay(300);
  }
}

// 播放小星星
void playTwinkleStar() {
  int notes[] = {NOTE_C4, NOTE_C4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_A4, NOTE_G4,
                 NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_D4, NOTE_D4, NOTE_C4};
  int durations[] = {300, 300, 300, 300, 300, 300, 600,
                     300, 300, 300, 300, 300, 300, 600};
  
  for (int i = 0; i < 14; i++) {
    playTone(notes[i], durations[i]);
    delay(durations[i] / 3);  // 音符之间的间隔
  }
}

// 播放生日快乐
void playHappyBirthday() {
  int notes[] = {NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_F4, NOTE_E4,
                 NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_G4, NOTE_F4,
                 NOTE_C4, NOTE_C4, NOTE_C5, NOTE_A4, NOTE_F4, NOTE_E4, NOTE_D4,
                 NOTE_A4, NOTE_A4, NOTE_A4, NOTE_F4, NOTE_G4, NOTE_F4};
  int durations[] = {200, 200, 400, 400, 400, 800,
                     200, 200, 400, 400, 400, 800,
                     200, 200, 400, 400, 400, 400, 800,
                     200, 200, 400, 400, 400, 800};
  
  for (int i = 0; i < 25; i++) {
    playTone(notes[i], durations[i]);
    delay(durations[i] / 3);
  }
}

// 播放SOS紧急信号
void playSOS() {
  // S ... (3短音)
  for (int i = 0; i < 3; i++) {
    playTone(880, 200);
    delay(200);
  }
  delay(300);
  
  // O --- (3长音)
  for (int i = 0; i < 3; i++) {
    playTone(880, 600);
    delay(200);
  }
  delay(300);
  
  // S ... (3短音)
  for (int i = 0; i < 3; i++) {
    playTone(880, 200);
    delay(200);
  }
}

// 播放指定频率和持续时间的音调
void playTone(int frequency, int duration) {
  tone(BUZZER_PIN, frequency, duration);
  delay(duration);
  noTone(BUZZER_PIN);
}

// 播放简单的蜂鸣声
void playBeep(int frequency, int duration) {
  tone(BUZZER_PIN, frequency, duration);
  delay(duration);
  noTone(BUZZER_PIN);
}